/* eslint-disable no-unused-vars */
// 观察者模式
export default class Observer {
    constructor(){
        this._message = new Map();
    }
    /**
     * 注册函数
     * @param type 注册的事件类型
     * @param fun 注册的函数
     * @param key 注册的key
     */
     on(type, fun,key,object) {
        if (this._message.get(type)) {
            this._message.get(type)?.set(key,{
                fun:fun,
                isPause:false,
                object
            });
        } else {
            this._message.set(type,new Map().set(key,{
                fun:fun,
                isPause:false,
                object
            }))
        }
    }
    /**
     * 执行全量函数
     * @param type 执行的函数类型 
     * @param args 执行函数需要回传的变量
     * @returns 
     */
     trigger(type, args = null,object) {
        if (!(this._message.get(type) instanceof Map)) return;
        // eslint-disable-next-line no-unused-vars
        if(object){
            this._message.get(type)?.forEach((value,key)=>{
                if( !value.isPause && value.object){
                    value.fun.call(this, args)
                }
            })
        }else{
            this._message.get(type)?.forEach((value,key)=>{
                if(!value.isPause && !value.object){
                    value.fun.call(this, args)
                }
            })
        }
    }
    /**
     * 函数只执行一次单例函数
     * @param type 执行函数的类型
     * @param args 入参的变量
     * @param keyName 入参的key
     * @returns 
     */
     one(type, args,tag) {
        if (!(this._message.get(type) instanceof Map)) return;
        this._message.get(type)?.forEach((value,key)=>{
            if(key === tag){
                value.fun.call(this, args)
                this._message.get(type)?.delete(key);
            }
        })
    }
    // 移出信息接口
    off(type, tag,object) {
        this._message.get(type)?.forEach((value,key)=>{
            if(tag === key){
                this._message.get(type)?.delete(key)
            }
        })
    }


    pause(type, tag,object){
        if (!(this._message.get(type) instanceof Map)) return;
        // eslint-disable-next-line no-unused-vars
        this._message.get(type)?.forEach((value,key)=>{
            if(key === tag){
                value.isPause = true
            }
        })
    }


    /**
     * 事件是否被暂停
     * @param {*} type 
     * @param {*} object 
     * @param {*} tag 
     * @returns 
     */
    isPauseEvent(type, tag,object){
        let isPause = false;
        this._message.get(type)?.forEach((value,key)=>{
            if(tag === key){
                isPause =  value.isPause
            }
        })
        return isPause
    }

    /**
     * 是否绑定了事件
     */
    hasEvent(type, tag,object){
        let isHasEvent = false;
        this._message.get(type)?.forEach((value,key)=>{
            if(tag === key){
                isHasEvent =  true
            }
        })
        return isHasEvent
    }
}